/***********************************************************************************
Copy right:	    Coffee Tech.
Author:         jiaoyue
Date:           2021-11-23
Description:    提供共享内存组件
***********************************************************************************/

#ifndef SHMEM_H
#define SHMEM_H

#include "pub_define.h"
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHM_NAME_SZ 32
#define MAX_NODE 10                // 最大支持学生数目
#define STD_NODE_LEN sizeof(data_t) // 结构体的大小
#define MAX_NODE_SIZE (MAX_NODE * STD_NODE_LEN + 8)

typedef union val_t
{
    int b_val;   // bool类型存储空间
    int i_val;   // 整形值存储空间
    float f_val; // 浮点值存储空间
    
} val_t;

typedef struct data_t
{
    int key;             // 唯一键值
    int type;            // 数据点类型
    int dev_type;        // 数据点属于哪个设备，根据网关支持的设备自行定义
    union val_t old_val; // 变化上报后需要更新旧值
    union val_t new_val; // 从共享内存取出最新数据，放到new_val中
    int ret;             // 默认为-1，采集成功后设置为0，采集失败再置-1
    int slave_addr;
    int addr;
} data_t;

typedef struct order_t
{
    long msg_type;  // 标示位
    int order_type; // 命令类型
    int key;        // 设备键值
    val_t val;      // 数据
} order_t;

struct shm_param
{
    int id; // 共享内存ID
    size_t size;
    void *addr;                 // 共享内存地址
    char name[SHM_NAME_SZ + 1]; // 共享内存key标识
};

int shm_init(struct shm_param *para, const char *name, size_t size);
void *shm_getaddr(struct shm_param *para);
void shm_write(const struct shm_param *para, void *data, size_t size);
int shm_del(const struct shm_param *para);
data_t data_init_val(data_t data, int key, int type, int dev_type, val_t old_val, val_t new_val, int ret); // 给结构体赋值
int is_real_order(order_t order);

#endif // SHMEM_H
